import pandas
import numpy
import matplotlib.pyplot as plt
import draw

# 读取源数据

# 从源数据提取出 x坐标， y坐标， 荧光数据， 以及设备信息

# 导出源数据为excel表格

# 对源数据进行作图

def readSpFile(path):
    print('开始读取文件:{}'.format(path))
    '''
    读入sp文件, 返回:激发波长，激发狭缝， 发射狭缝， 发射波长列表， 发射光强度列表
    @return: 激发波长，激发狭缝， 发射狭缝， 发射波长列表， 发射光强度列表
    '''
    data = pandas.read_csv(path, header=None)
    jiFa = float(data.iloc[10][0])
    jiFaXiaFeng = float(data.iloc[11][0])
    faSheXiaFeng = float(data.iloc[12][0])
    # #DATA是从第42行开始算的，其中文件中的空白行不计为一行
    data = data[42:]
    column = []
    intense = []
    for i in range(len(data)):
        row1 = data.iloc[i][0]
        row2 = data.iloc[i][0]
        c = float(row1.split()[0])
        d = float(row2.split()[1])
        column.append(c)
        intense.append(d)
    print('读取文件:{}  成功, 返回...'.format(path))
    return jiFa, jiFaXiaFeng, faSheXiaFeng, column, intense


def readManySpFile(route, fileName, number):
    print('开始读取多份文件..... 文件路径是:{}, 文件名是:{}, 总共{}个文件'.format(route, fileName, number))
    '''
    注意, 其中返回的激发狭缝, 发射狭缝, 发射波长列别, 都是最后一个文件中记录的值,请注意
    route: 路由, 比如数据存在 ./data/510116/  那这个就是路径，记得带上后面的/,表示路径
    fileName: 比如 nadh#--.sp,其中-- 会被替换成数字,一般number小于等于99,所以两位数字
    number: 文件个数, 根据number生成真实文件名
    '''
    jifaBoChang = []
    fasheBoChang = []
    intenses = []
    for i in range(number):
        f = fileName
        f = f.replace('--','{:0>2d}'.format(i+1))
        path = route + f
        jiFa, jiFaXiaFeng, faSheXiaFeng, column, intense = readSpFile(path)
        fasheBoChang = column
        jifaBoChang.append(jiFa)
        intenses.append(intense)
    print('{}个文件读取成功, 返回...'.format(number))
    return jiFaXiaFeng, faSheXiaFeng, jifaBoChang, fasheBoChang, intenses

# 从多个路径中读取SpFile
def fromManyRouteReadSpFile(rootRoute, subRoutes: list, fileName, number):
    print('开始从多个路径读取文件, 根路径是:{}, 子路径是:{}, 文件名:{}, 文件个数:{}'.format(rootRoute, subRoutes, fileName, number))
    '''
    这个方法假设所有样品都是同一个实验测的, 很多参数都是一样的，比如文件名, 文件个数

    rootRoute: 根路径 比如 ./data/
    subRoutes: 子路径 比如 ['510116000/', '510116001/', '510116002/']
    fileName: 同 def readManySpFile(route, fileName, number)
    number: 同 def readManySpFile(route, fileName, number)

    输出格式：   [[[[  xx  ]]]]
    '''
    experiment = []
    for i in range(len(subRoutes)):
        sample = []
        jiFaXiaFeng, faSheXiaFeng, jifaBoChang, fasheBoChang, intenses = readManySpFile(rootRoute + subRoutes[i], fileName, number)
        sample.append(jiFaXiaFeng)
        sample.append(faSheXiaFeng)
        sample.append(jifaBoChang)
        sample.append(fasheBoChang)
        sample.append(intenses)
        sample.append((subRoutes[i])[0: len(subRoutes[i]) - 1])  # 记录一下文件名 用于生成excel时使用
        experiment.append(sample)
    print('多路径文件处理完成....')
    return experiment

def matrixToExcel(experiment, targetPath):
    print('开始导出多个excel文件.....')
    '''
    输出实验矩阵数据到excel中去，格式应该是：

                激发波长1   激发波长2   激发波长3   激发波长4   激发波长5
    
    发射波长1   111         222         333        444         555

    发射波长2   111         222         333        444         555

    发射波长3   111         222         333        444         555

    发射波长4   111         222         333        444         555
    '''
    #print(experiment[0][3]) # 发射波长
    experiment[0][3].reverse()
    experiment[0][3].append(0)
    experiment[0][3].reverse()
    # print(experiment[0][3]) # 第一个位置补0后的发射波长数组
    for sample in experiment:
        matrix = []
        matrix.append(experiment[0][3]) # 给发射波长开头加一个值
        # sample : 0jiFaXiaFeng, 1faSheXiaFeng, 2jifaBoChang, 3fasheBoChang, 4intenses  5fileName
        # 写入excel要先生成一个矩阵，在把矩阵写入。先生成转置矩阵，在转置一下就可以了。
        jifaBoChang = sample[2]
        intenses = sample[4]
        fileName = sample[5]
        for i in range(len(jifaBoChang)):  # 把激发波长加到数据前面
            intenses[i].reverse()
            intenses[i].append(jifaBoChang[i])
            intenses[i].reverse()
            matrix.append(intenses[i])
        matrix = numpy.mat(matrix)
        matrix = matrix.T
        ds = pandas.DataFrame(matrix)
        ds.to_excel(targetPath + fileName + '.xls', index=None, header=None)
        print('导出文件./target/{}.xls成功....'.format(fileName))
        #ds.drop()
    print('导出excel文件成功.....')
    

# 第一个参数是源文件存放的目录，第二个参数是一个列表，每个目录中都存了很多sp文件，组织格式参照data目录下已有的文件存放格式
# 第三个参数是文件名,其中 -- 会被替换成01 - 99的数字，后面20是文件的个数
directPath = ['510116000/','510116001/','510116002/','510116003/','510116004/','510116005/','510116006/']
rootPath = './data/'
fileName = 'nadh#--.sp'
spNumPerSample = 20
exp = fromManyRouteReadSpFile(rootPath, directPath, fileName, spNumPerSample)
# 把矩阵导出到excel, 第一个参数是上面方法生成的, 第二个参数是目标目录, 需要手动创建
excelRootPath = './target/'
matrixToExcel(exp, excelRootPath)
# 画图
toPath = './target/'
for directPath in directPath:
    print('正在保存图像:{}'.format(directPath[0:len(directPath) - 1]))
    fileName = directPath[:len(directPath) - 1]
    X, Y, Z = draw.read3DdataFromExcel(excelRootPath + fileName + '.xls')
    draw.drawContourMap(X, Y, Z, toPath, fileName)